package com.bskms.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.StandardCharsets;

/**
 * AI菜谱推荐工具类
 * 
 * 功能说明：
 * 1. AI集成：对接DeepSeek AI对话接口，提供智能菜谱推荐
 * 2. 需求解析：理解用户的饮食偏好、时间限制、营养需求等
 * 3. 菜谱生成：调用AI模型生成详细的菜谱内容和制作步骤
 * 4. 结果优化：对AI返回结果进行格式化和错误处理
 * 5. 异常处理：提供完善的错误处理和降级机制
 * 
 * 设计思路：
 * - 使用静态方法，提供工具类功能
 * - 集成DeepSeek API，实现智能推荐
 * - 采用HTTP客户端，进行API调用
 * - 提供参数验证，确保输入有效性
 * - 实现异常处理，保证系统稳定性
 * 
 * 技术特点：
 * - AI模型集成，提供智能推荐
 * - HTTP客户端，支持异步调用
 * - JSON处理，支持复杂数据结构
 * - 异常处理，提供降级机制
 * - 参数验证，确保输入安全
 * 
 * 使用说明：
 * 1. 确保API密钥有效且有足够的调用额度
 * 2. 根据实际需求调整模型参数
 * 3. 处理API调用异常和网络问题
 * 4. 根据返回结果进行业务逻辑处理
 * 
 * @author 系统开发者
 * @version 1.0
 * @since 2024
 */
public class AIRecipeUtils {
    // 1. 核心配置（必须替换为你的真实信息！）
    // DeepSeek官方AI对话接口地址（固定，不要修改）
    private static final String DEEPSEEK_ENDPOINT = "https://api.deepseek.com/v1/chat/completions";
    // 替换为你从DeepSeek平台获取的有效API密钥（格式：sk-开头的字符串）
    private static final String DEEPSEEK_API_KEY = "sk-70f26276abdb425c82e7dd2289e99299";
    private static final Logger logger = LoggerFactory.getLogger(AIRecipeUtils.class);

    /**
     * 调用DeepSeek API生成菜谱推荐
     * @param userDemand 用户需求（如“清淡家常菜，30分钟完成”）
     * @return AI生成的菜谱文本（失败返回友好提示，而非null）
     */
    public static String getAIRecipeRecommend(String userDemand) {
        // 第一步：校验用户输入（避免空请求）
        if (userDemand == null || userDemand.trim().isEmpty()) {
            logger.error("AI推荐失败：用户需求为空");
            return "请输入AI推荐需求（如“清淡家常菜，30分钟完成”）";
        }

        // 第二步：构建HTTP请求并调用DeepSeek API
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 2.1 创建POST请求（使用DeepSeek官方对话接口）
            HttpPost httpPost = new HttpPost(DEEPSEEK_ENDPOINT);

            // 2.2 设置请求头（严格遵循DeepSeek要求）
            httpPost.setHeader("Content-Type", "application/json;charset=UTF-8"); // 必须带UTF-8，避免中文乱码
            httpPost.setHeader("Authorization", "Bearer " + DEEPSEEK_API_KEY); // Bearer认证格式，密钥拼在后面

            // 2.3 构建请求体（完全匹配DeepSeek对话接口格式）
            JSONObject requestBody = new JSONObject();
            requestBody.put("model", "deepseek-chat"); // DeepSeek通用聊天模型（固定值，不要修改）
            requestBody.put("temperature", 0.7); // 生成随机性（0-1，越小越稳定）
            requestBody.put("max_tokens", 500); // 限制生成长度（避免内容过长，DeepSeek免费额度足够）

            // 构建对话内容（DeepSeek要求messages是JSON数组，每个元素包含role和content）
            JSONArray messages = new JSONArray();
            JSONObject userMessage = new JSONObject();
            userMessage.put("role", "user"); // 固定为"user"（表示用户输入）
            userMessage.put("content", String.format(
                    "请根据用户需求生成1份简单菜谱，包含【早餐、午餐、晚餐】三部分，每部分需有菜名和1-2句做法说明，格式简洁，不要多余内容",
                    userDemand
            ));
            messages.add(userMessage);
            requestBody.put("messages", messages); // 注意：这里是JSON数组，不是单个JSONObject

            // 2.4 设置请求体（用UTF-8编码，避免中文乱码）
            httpPost.setEntity(new StringEntity(requestBody.toString(), StandardCharsets.UTF_8));

            // 第三步：发送请求并解析响应
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    // 读取响应内容（UTF-8解码）
                    String responseStr = EntityUtils.toString(entity, StandardCharsets.UTF_8);
                    JSONObject responseJson = JSONObject.parseObject(responseStr);

                    // 3.1 处理成功响应（DeepSeek返回格式：choices[0].message.content）
                    if (responseJson.containsKey("choices") && !responseJson.getJSONArray("choices").isEmpty()) {
                        JSONObject choice = responseJson.getJSONArray("choices").getJSONObject(0);
                        String aiContent = choice.getJSONObject("message").getString("content");
                        logger.info("DeepSeek AI菜谱推荐成功，内容：{}", aiContent);
                        return aiContent;
                    }
                    // 3.2 处理失败响应（识别DeepSeek常见错误）
                    else if (responseJson.containsKey("error")) {
                        String errorMsg = responseJson.getJSONObject("error").getString("message");
                        logger.error("AI推荐失败：DeepSeek返回错误，响应体：{}，错误信息：{}", responseStr, errorMsg);
                        // 针对常见错误返回友好提示
                        if (errorMsg.contains("Insufficient Balance")) {
                            return "AI推荐失败：DeepSeek账号额度不足，请充值或更换API密钥";
                        } else if (errorMsg.contains("Invalid API Key")) {
                            return "AI推荐失败：DeepSeek API密钥无效，请核对密钥";
                        } else {
                            return "AI推荐失败：" + errorMsg;
                        }
                    }
                    // 3.3 处理未知响应格式
                    else {
                        logger.error("AI推荐失败：响应格式异常，响应体：{}", responseStr);
                        return "AI推荐失败：响应格式异常，请稍后重试";
                    }
                } else {
                    logger.error("AI推荐失败：DeepSeek API响应无内容");
                    return "AI推荐失败：响应无内容，请稍后重试";
                }
            }
        } catch (Exception e) {
            logger.error("AI推荐接口调用异常（网络/IO错误）", e);
            return "AI推荐失败：网络异常，请检查网络连接";
        }
    }

    // 测试方法（本地运行验证，部署时可删除）
    public static void main(String[] args) {
        String result = AIRecipeUtils.getAIRecipeRecommend("清淡家常菜，30分钟完成");
        System.out.println("AI推荐结果：\n" + result);
    }
}